import logging
from logging.handlers import RotatingFileHandler

import redis
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect
from flask_session import Session
from config import Config
from config import config
from flask_wtf.csrf import generate_csrf

# 配置数据库
db =SQLAlchemy()
redis_store = None



def create_app(config_name):
    """通过传入不同的配置名字,初始化其对应配置的应用实例"""
    app = Flask(__name__)

    app.config.from_object(Config)

    db.init_app(app)

    global redis_store

    #配置redis
    redis_store = redis.StrictRedis(host=Config.REDIS_HOST,port=Config.REDIS_PORT)

    #开启csrf保护
    CSRFProtect(app)
    """
    flask中,由flask_wtf扩展包提供了csrf方法机制,但是这个功能,只实现了两个小功能:
    1.生成了一个随机的csrf token 字符串,flask_wtf.csrf的generate_csrf函数生成
    2.在用户请求的时候,校验csrf token 是否正确,在flask_wtf.csrf的CSRFProtect中
    """
    #1.告诉浏览器,我们已经生成了csrf_token
    @app.after_request   #在这个钩子,在客户端请求成功以后,自动执行
    def after_request(response):
        #生成csrf_token
        csrf_token=generate_csrf()
        #可以通过设置coolkie的方式,把csrf_token告诉浏览器
        response.set_cookie("csrf_token",csrf_token)

        return response



    #设置ssession保存设置
    Session(app)

    #配置项目日志
    setup_log(config_name)

    #注册蓝图
    from info.modules.index import index_blu
    app.register_blueprint(index_blu)
    #注册登录页面
    from info.modules.passport import passport_blu
    app.register_blueprint(passport_blu)

    #注册自定义过滤器
    from info.utils.common import do_index_class
    app.add_template_filter(do_index_class,"index_cls")

    return app

def setup_log(config_name):
    """"配置日志"""

    #设置日志的记录等级
    logging.basicConfig(level=config[config_name].LOG_LEVEL)  #吊事debug级

    #创建日志记录器,指明日日志保存的路径,每个日志文件的最大大小,保存的日志文件个数上限
    file_log_handler = RotatingFileHandler("logs/log",maxBytes=1024 * 1024 * 100,backupCount=10)





